package com.aaa.ssm.service.impl;

import com.aaa.ssm.dao.MenuDao;
import com.aaa.ssm.entity.TreeNode;
import com.aaa.ssm.entity.User;
import com.aaa.ssm.service.MenService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @ fileName:MenuServiceImpl
 * @ description:
 * @ createTime:2023/3/27 11:22
 * @ version:1.0.0
 */
@Service
public class MenuServiceImpl implements MenService {

    @Resource
    private MenuDao menuDao;
    //依赖注入session   该session和shiro的session相通的
    @Resource
    private HttpSession session;

    /**
     * 分装格式化时间类
     * @return
     */
    private static String time(){
        //获取当前时间
        Date date = new Date();
        //实例化格式化时间类
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //format格式化时间
        String format = simpleDateFormat.format(date);
        return format;
    }

    @Override
    public List<TreeNode> queryTreeDate() {
        //查询所有数据
        List<TreeNode> treeNodeList = menuDao.queryAll();
        //定义返回集合
        List<TreeNode> returnTreeNodeList = new ArrayList<>();
        //判断所有数据是否为null
        //if(treeNodeList!=null&&treeNodeList.size()>0){
        if(!CollectionUtils.isEmpty(treeNodeList)){
            //循环遍历，查找一级节点
            for (TreeNode treeNode : treeNodeList) {
                //父节点为0，都是根节点
                if(treeNode.getParentId()==0){
                    returnTreeNodeList.add(treeNode);
                    //为1级节点找子节点
                    bindChildren(treeNode,treeNodeList);
                }
            }
        }
        return returnTreeNodeList;
    }

    @Override
    public List<TreeNode> queryTreeNodeByUserId() {
        //从session获取当前登录登录的对象
        int userA = (int) session.getAttribute("userA");
        System.out.println("-------"+userA+"-------------");
        //查询所有数据
        List<TreeNode> treeNodeList = menuDao.queryTreeNodeByUserId(userA);
        //定义返回数据列表 拼装成前端要的格式
        List<TreeNode> returnTreeNodeList = new ArrayList<>();
        //循环所有数据
        for (TreeNode treeNode : treeNodeList) {
            //判断是否是根节点，如果是直接添加到返回集合
            if(treeNode.getParentId()==0){
                //一级节点添加返回集合
                returnTreeNodeList.add(treeNode);
                //绑定孩子节点
                bindChildren(treeNode,treeNodeList);
            }
        }
        return returnTreeNodeList;
    }

    /**
     * 从所有节点中查找当前节点的孩子
     * @param currentTreeNode
     * @param treeNodeList
     */
    private  void bindChildren(TreeNode currentTreeNode, List<TreeNode> treeNodeList){
         //循环查找当前节点的孩子
        for (TreeNode treeNode : treeNodeList) {
            //判断循环节点的父节点id是否和当前节点相等
            if(treeNode.getParentId()==currentTreeNode.getId()){
                //获取当前节点的孩子集合
                List<TreeNode> children = currentTreeNode.getChildren();
                //判断孩子集合是否为null
                if(children==null){
                    //实例化对象，否则会报空指针异常
                    children = new ArrayList<>();
                }
                //添加当前节点到孩子集合
                children.add(treeNode);
                //和当前对象进行绑定
                currentTreeNode.setChildren(children);
                //递归 调用自己为当前节点绑定孩子
                bindChildren(treeNode,treeNodeList);
            }
        }
    }

    /**
     * 添加菜单节点
     * @param treeNode
     * @return
     */
    @Override
    public int add(TreeNode treeNode) {
        return menuDao.add(treeNode);
    }

    /**
     * 更细菜单节点信息
     * @param treeNode
     * @return
     */
    @Override
    public int update(TreeNode treeNode) {
        return menuDao.update(treeNode);
    }

    /**
     * 根据编号删除菜单节点信息
     * @param menuId
     * @return
     */
    @Override
    public int delete(int menuId) {
        return menuDao.delete(menuId);
    }
}
